package beans;

import pool.*;
import java.util.*;
import java.sql.*;

/**
 * @author Antonin Mozzati
 * @author Yannick Schürter
 */
public class ListeFlux {

    private ArrayList<FluxBean> listeFlux;
    JDCConnectionDriver driver;
    Connection connexion;

    public ListeFlux(JDCConnectionDriver driver) throws Exception {
	this.driver = driver;
    }

    // Retourne la liste des flux actuellement dans la base
    public ArrayList<FluxBean> getListeFlux() {
	PreparedStatement ps;
	listeFlux = new ArrayList<FluxBean>();
	try {
	    this.connexion = driver.connect("jdbc:jdc:jdcpool", null);

	    ps = connexion.prepareStatement("SELECT id_flux, id_utilisateur, estPublic,"
		    + " titreFlux, descriptionFlux FROM app.flux");
	    ResultSet rs = ps.executeQuery();
	    while (rs.next()) {
		FluxBean flux = new FluxBean(
			new Integer(rs.getString(1)),
			new Integer(rs.getString(2)),
			new Integer(rs.getString(3)),
			rs.getString(4),
			rs.getString(5));
		listeFlux.add(flux);
	    }
	    ps.close();

	} catch (Exception e) {
	    System.out.println("Pb fermeture: " + e.getMessage());
	    e.printStackTrace();
	}
	return listeFlux;
    }

    public int addFlux(FluxBean fb) {
	try {
	    this.connexion = driver.connect("jdbc:jdc:jdcpool", null);
	    PreparedStatement ps;
	    System.out.println("Ajout du flux " + fb.getTitreFlux());

	    ps = connexion.prepareStatement("Insert into app.flux (id_utilisateur, estPublic, titreFlux,  descriptionFlux) VALUES ("
		    + fb.getId_utilisateur() + ", "
		    + fb.getEstPublic() + ", "
		    + "'" + fb.getTitreFlux().replace("'", "''") + "', "
		    + "'" + fb.getDescriptionFlux().replace("'", "''") + "')", Statement.RETURN_GENERATED_KEYS);
	    ps.executeUpdate();
	    System.out.println("Flux ajouté avec succès.");

	    // Récupération de l'id du flux générée à l'insertion
	    ResultSet keys = ps.getGeneratedKeys();
	    keys.next();
	    int insertID = keys.getInt(1);

	    ps.close();
	    return insertID;
	} catch (Exception e) {
	    e.printStackTrace();
	}
	return 0;
    }

    //pas testé
    public void removeFluxByID(int id) {
	try {
	    this.connexion = driver.connect("jdbc:jdc:jdcpool", null);
	    PreparedStatement ps;
	    System.out.println("Suppresion du flux " + id);
	    ps = connexion.prepareStatement("DELETE FROM app.flux WHERE ID_FLUX=" + id);
	    ps.executeUpdate();
	    System.out.println("Flux " + id + " retiré avec succès.");
	    ps.close();
	} catch (Exception e) {
	    e.printStackTrace();
	}
    }

    public FluxBean getById(int id_flux) {
	for (FluxBean fb : this.getListeFlux()) {
	    if (fb.getId_flux() == (id_flux)) {
		System.out.println("Flux " + fb.getId_flux() + " ( " + fb.getTitreFlux() + " )");
		return fb;
	    }
	}
	return null;
    }

    public ArrayList<FluxBean> getByUser(int id_utilisateur) {
	ArrayList<FluxBean> listeFlux = new ArrayList<FluxBean>();
	for (FluxBean fb : this.getListeFlux()) {
	    if (fb.getId_utilisateur() == (id_utilisateur)) {
		System.out.println("Flux " + fb.getId_flux() + " ( " + fb.getTitreFlux() + " )");
		if (!listeFlux.contains(fb)) {
		    listeFlux.add(fb);
		}
	    }
	}
	return listeFlux;
    }

    /**
     * @param id_utilisateur
     * @return le nombre de flux créé par un utilisateur
     */
    public int getNbByUser(int id_utilisateur) {
	int res = 0;
	for (FluxBean fb : this.getListeFlux()) {
	    if (fb.getId_utilisateur() == id_utilisateur) {
		res++;
	    }
	}
	return res;
    }

    public boolean appartient(int id_flux, int id_utilisateur) {
	FluxBean fb = this.getById(id_flux);
	if ((fb != null) && (fb.getId_utilisateur() == id_utilisateur)) {
	    return true;
	} else {
	    return false;
	}
    }

    /**
     * @param idUtilisateur
     * @return le flux public d'un utilisateur
     */
    public FluxBean getFluxPublicByUtilID(int idUtilisateur) {
	for (FluxBean fb : this.getListeFlux()) {
	    if ((fb.getId_utilisateur() == idUtilisateur) && (fb.getEstPublic() == 1)) {
		return fb;
	    }
	}
	return null;
    }
    
    public boolean estPublic(int id){
	return (this.getById(id).getEstPublic() == 1);
    }
    
    
    public ArrayList<NouvelleBean> getNouvellesPublic(ArrayList<NouvelleBean> listeNouvelle){
	ArrayList<NouvelleBean> res = new ArrayList<NouvelleBean>();
	for(NouvelleBean nb : listeNouvelle){
	    if(this.estPublic(nb.getId_flux()))
		res.add(nb);
	}
	return res;
    }
    
}
